﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class ListaNieuporzadkowana<T> where T : System.IComparable<T>
{
    int rozmiar; // rozmiar tablicy
    T[] tab; // tablica do przechowywania elementów

    public ListaNieuporzadkowana() // konstruktor domyślny
    {
        tab = null; // ustawienie tablicy na null
        rozmiar = 0; // ustawienie rozmiaru tablicy na 0
    }

    ~ListaNieuporzadkowana() // destruktor
    {
    }

    public void Wstaw(T o) // funkcja wstawiająca nowy element na koniec listy
    {
        Array.Resize(ref tab, rozmiar+1); // rozszerzenie rozmiaru tablicy o 1
        tab[rozmiar] = o; // przypisanie obiektu na koniec tablicy
        rozmiar++; // zwiększenie rozmiaru tablicy o 1
                // Console.WriteLine("Dodano: {0}", o); // wyświetlenie raportu o dodaniu elementu
    }
    public T ZwrocMin()
    {
        int temp = ZnajdzMinIndex();
        return tab[temp];
    }
    public void UsunMin() // funkcja usuwająca minimalny element z listy
    {
        try
        {
            int temp =ZnajdzMinIndex(); // podstawienie pod zmienną "temp" indeksu minimalnego elementu listy
            //int consWrite = arr[temp]; // zachowanie usuwanego elementu do póxniejszego wyświetlenia raportu
            if (temp == rozmiar - 1)
            {
                Array.Resize(ref tab, rozmiar - 1); // jeżeli element jest na końcu listy, to zmniejszamy ją o 1 przez Resize
                rozmiar--;
            }
            else if (rozmiar == 1)
            {
                tab = null; // jeżeli lista ma 1 element, to ustawiamy ją na null
                rozmiar--;
            }
            else
            {
                rozmiar--;
                T tmp = tab[rozmiar];
                Array.Resize(ref tab, rozmiar);//zmniejszamy rozmiar tablicy
                tab[temp] = tmp;
            }
            // Console.WriteLine("Usunięto: {0}",consWrite); // wyświetlenie raportu o usunieciu elementu
        }
        catch { }
    }
    public int ZwrocRozmiar()
    {
        return rozmiar;
    }
    int ZnajdzMinIndex() // funkcja znajdująca indeks minimalnego element listy
    {
        if (rozmiar == 0) throw new ArgumentException("Lista jest pusta"); // rzucenie wyjatku w przypadku, gdy lista jest pusta
        else
        {
            T temp = tab[0]; // podstawienie do zmiennej "temp" pierwszego elementu listy
            int indx = 0; // zmienna przechowująca indeks elementu
            for (int i = 1; i < rozmiar; i++) // sprawdzenie wszystkich elementów listy
            {
                if (tab[i].CompareTo(temp) < 0)
                {
                    temp = tab[i]; // jeżeli funkcja napotka obiekt mniejszy od aktualnego "temp"
                                   // podstawi ten obiekt do zmiennej "temp"
                    indx = i;          // przypisanie do zmiennej indx indeksu najmniejszego znalezionego elementu
                }
            }
            return indx; // zwrócenie indeksu minimalnego elementu listy
        }
    }
    public void Pokaz() // funkcja znajdująca indeks minimalnego element listy
    {
        for (int i = 0; i < rozmiar; i++) // sprawdzenie wszystkich elementów listy
        {
            Console.WriteLine(" {0} ", tab[i]);
        }
    }
}